c++ - Visual C++ volatile
全部标签 volatilesig_atomic_t是否提供任何内存顺序保证?例如。如果我只需要加载/存储一个整数,可以使用吗?例如这里:volatilesig_atomic_tx=0;...voidf(){std::threadt([&]{x=1;});while(x!=1){/*waiting...*/}//done!}这是正确的代码吗?在某些情况下它可能不起作用?注意:这是一个过度简化的示例,即我不是在为给定的代码片段寻找更好的解决方案。我只想了解在根据C++标准的多线程程序中,我可以从volatilesig_atomic_t中得到什么样的行为。或者,如果是这种情况,请理解行为未定义的原因。
有两个线程(t1和t2)固定到两个不同的核心。它们都有一个共享变量,它是指向某个类类型的原始指针。t1只读指针,t2读/写指针。我应该将指针声明为volatile或atomic还是两者兼而有之?当t2更新这个指针时,t1读取旧指针或新指针都可以,但它不应该读取任何中间值,因为它会导致段错误。 最佳答案 volatile可用于告诉编译器不要优化对变量使用的内存的重复访问。显然,如果另一个线程可以更新变量,您将需要它。它被称为“几乎无用”的原因是,在太多情况下,这不足以保证正确的多线程行为,您需要查看内存栅栏和原子原语操作。在某些处理器
在使用AtmelSAM3X8E处理嵌入式系统项目时,我注意到某些CMSIS头文件中有以下代码。#ifndef__cplusplustypedefvolatileconstuint32_tRoReg;/**为什么C++的typedef不包含const?我在某处看到有人提到C++不会在运行时内存中存储整数const变量,如果为真,则意味着const需要被删除,因为微Controller寄存器是如何映射内存的,但我可以'似乎没有找到任何其他说明C++可以做到这一点的内容(尽管我的搜索确实非常简短)。没有太多的C++经验,我还认为可能是C++不允许const结构成员,因为这些typedef主要
请注意,以下两个函数具有相同的类型和签名:voidfoo1(intt){}//foo1hastype'void(*)(int)',andsignature'(*)(int)'voidfoo2(constintt){}//Alsotype'void(*)(int)',signature'(*)(int)'(const不是函数类型或函数签名的一部分)。同样,返回类型上的修饰符(const或volatile)不会影响函数类型或函数签名。但是,在函数定义本身(未显示)中,命名变量t确实在foo2中保持const资格。有许多StackOverflow问题在讨论为什么函数的返回类型不被视为函数签名
短整数的模数不正确。这真的很奇怪,已经花了我两天时间。我将有问题的代码缩小如下(尽可能简化):#include#includeintfoo(shortWidth,shortHeight,shortMSize){shorti=0,k=0,pos=0;shortj=0;for(j=1;j=1024){fprintf(stderr,"pos=%d,over1024\n",(int)pos);}pos=pos+1;}}return0;}intmain(intargc,char*argv[]){foo(32,32,8);return0;}以上代码在Debug模式下编译正常,j%MSize的结果是
在这里从m_flag的定义中删除volatile是否安全?如果m_flag不是易变的,什么会阻止编译器优化这个循环的条件:while(!m_flag)m_cv.wait(lock);?标准(C++11之后)是否明确规定在这种情况下禁止进行此类优化?#include#include#include#includeusingnamespacestd;classfoofoo{volatileboolm_flag;mutexm_mutex;condition_variablem_cv;public:voidDoWork(){m_flag=false;unique_locklock(m_mute
只是好奇为什么参数在操作重载中必须是常量CVector&CVector::operator=(constCVector¶m){x=param.x;y=param.y;return*this;}难道你不能轻松地完成这样的事情吗??CVector&CVector::operator=(CVector¶m)//noconst{x=param.x;y=param.y;return*this;}不是当某些东西变成常量时,它在应用程序的剩余生命周期中是不可更改的吗??这在操作重载方面有何不同??? 最佳答案 你不需要常量:@nu
在C++中,volatile同样对待const是:将指向volatile数据的指针传递给不需要volatile的函数修饰符触发编译错误。intfoo(int*bar){/*snip*/}intmain(){volatileint*baz;foo(baz);//error:invalidconversionfrom‘volatileint*’to‘int*’}为什么危险?对于const很明显删除它会破坏的修饰符const正确性;但是否存在“volatile正确性”这样的东西?我无法弄清楚将指向volatile数据的指针作为指向非volatile数据的指针传递会如何导致问题。编辑只是为了让
我正在创建一个小程序来测量boost::shared_ptr和boost::intrusive_ptr类型容器之间的性能差异。为了防止编译器优化拷贝,我将变量声明为volatile。循环看起来像这样://TestCopymeasuresthetimerequiredtocreatencopiesofthegivencontainer.//Returnstimeinmilliseconds.templatetime_tTestCopy(constContainer&inContainer,std::size_tn){Poco::Stopwatchstopwatch;stopwatch.s
假设我有以下功能。std::mutexmutex;intgetNumber(){mutex.lock();intsize=someVector.size();mutex.unlock();returnsize;}这是在声明大小时使用volatile关键字的地方吗?如果我不使用volatile,返回值优化或其他东西会破坏这段代码吗?someVector的大小可以从程序拥有的众多线程中的任何一个更改,并且假定只有一个线程(修饰符除外)调用getNumber()。 最佳答案 没有。但请注意,大小可能无法反射(reflect)互斥锁释放后的